#include "rs485.h"

static void Rs485CtrlInit(void)
{
	GPIO_InitTypeDef GPIO_InitStruct;
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	
	GPIO_InitStruct.GPIO_Pin=GPIO_Pin_4;
	GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;
	GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_InitStruct);
}

void Rs485SetMode(RS485_MODE mode)
{
	if(mode == RS485_TX)
	{
		GPIO_SetBits(GPIOA,GPIO_Pin_4);
	}
	else if(mode == RS485_RX)
	{
		GPIO_ResetBits(GPIOA,GPIO_Pin_4);
	}
}


void Rs485Init(u32 baudrate)
{
	Rs485CtrlInit();
	Rs485SetMode(RS485_RX);
	
	bspUsart2Init(baudrate);
}

void Rs485Send(const char* data, u32 size)
{
	Rs485SetMode(RS485_TX);
	
	bspUsart2Send(data,size);
	
	Rs485SetMode(RS485_RX);
	
}

u32 Rs485Receive(void** pBuffer)
{
	return bspUsart2Receive(pBuffer);
}


void Rs485Send_u16(const u16* data, u32 size)
{
	char data_u8[2*size];	
	u32 i;
	for(i=0;i<size;i++)
	{
		data_u8[2*i+1]=data[i];
		data_u8[2*i]=data[i]>>8;
	}
	Rs485SetMode(RS485_TX);
	
	bspUsart2Send(data_u8,2*size);
	
	Rs485SetMode(RS485_RX);
}